package org.ytor.common.enums;


import org.ytor.common.util.Strs;

import java.io.IOException;
import java.io.InputStream;

/**
 * 文件类型枚举
 */
public enum FileType {
    // Office 文档
    XLS("D0CF11E0", "xls"),
    XLSX("504B0304", "xlsx"),
    DOC("D0CF11E0", "doc"),
    DOCX("504B0304", "docx"),
    PPTX("504B0304", "pptx"),

    // 图片
    JPEG("FFD8FF", "jpg"),
    PNG("89504E47", "png"),
    GIF("47494638", "gif"),
    BMP("424D", "bmp"),
    WEBP("52494646", "webp"), // 注意：WebP 与 RIFF 格式共用，需要二级判断

    // 压缩
    ZIP("504B0304", "zip"),
    RAR("52617221", "rar"),
    _7Z("377ABCAF271C", "7z"),
    GZ("1F8B08", "gz"),
    TAR("7573746172", "tar"), // "ustar"

    // 文本 / 数据
    PDF("25504446", "pdf"),
    TXT("", "txt"), // 文本无法靠魔数识别，只能 fallback
    XML("3C3F786D6C", "xml"), // "<?xml"
    HTML("68746D6C3E", "html"), // "html>"
    JSON("7B", "json"), // "{"

    // 多媒体
    MP3("494433", "mp3"), // ID3 开头
    MP4("0000001866747970", "mp4"), // ISO Base Media Format
    AVI("52494646", "avi"), // RIFF
    WMV("3026B2758E66CF11", "wmv"),
    FLV("464C56", "flv"),
    MOV("6D6F6F76", "mov"),
    WAV("52494646", "wav"), // RIFF

    // 未知
    UNKNOWN("", "unknown");

    final String magicNum;
    final String suffix;

    FileType(String magicNum, String suffix) {
        this.magicNum = magicNum;
        this.suffix = suffix;
    }

    //通过文件前几个字节来判断文件类型
//    public static FileType getFileType(InputStream is) throws IOException {
//        if (!is.markSupported()) {
//            throw new IOException("输入流【" + is + "】不支持回退");
//        }
//        byte[] buffer = new byte[20];
//
//        is.mark(buffer.length);
//        int readSize = is.read(buffer, 0, 20);
//        is.reset();
//
//        if (readSize == -1) {
//            return UNKNOWN;
//        }
//
//        String currentMagicNum = Strs.toHex(buffer);
//        for (FileType type : FileType.values()) {
//            if (type == UNKNOWN) {
//                continue;
//            }
//            if (currentMagicNum.startsWith(type.magicNum)) {
//                return type;
//            }
//        }
//        return UNKNOWN;
//    }

}
